home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 2 / AACD 2.iso / AACD / Magazine / GraphicsCards / StormMesa / demos / isosurf.c < prev    next >
C/C++ Source or Header  |  1998-12-15  |  6KB  |  315 lines

  1. /* $Id: isosurf.c,v 3.0 1998/02/14 18:42:29 brianp Exp $ */
  2.  
  3. /*
  4.  * Display an isosurface of 3-D wind speed volume.  Use arrow keys to
  5.  * rotate, S toggles smooth shading, L toggles lighting
  6.  * Brian Paul  This file in public domain.
  7.  */
  8.  
  9. /*
  10.  * $Log: isosurf.c,v $
  11.  * Revision 3.0  1998/02/14 18:42:29  brianp
  12.  * initial rev
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <stdlib.h>
  21. #include <math.h>
  22. #include "GL/glut.h"
  23.  
  24.  
  25. GLboolean speed_test = GL_FALSE;
  26. GLboolean use_vertex_arrays = GL_FALSE;
  27.  
  28. GLboolean doubleBuffer = GL_TRUE;
  29.  
  30. GLboolean smooth = GL_TRUE;
  31. GLboolean lighting = GL_TRUE;
  32.  
  33.  
  34.  
  35. #define MAXVERTS 10000
  36.  
  37. static GLfloat verts[MAXVERTS][3];
  38. static GLfloat norms[MAXVERTS][3];
  39. static GLint numverts;
  40.  
  41. static GLfloat xrot;
  42. static GLfloat yrot;
  43.  
  44.  
  45.  
  46. static void read_surface( char *filename )
  47. {
  48.    FILE *f;
  49.  
  50.    f = fopen(filename,"r");
  51.    if (!f) {
  52.       printf("couldn't read %s\n", filename);
  53.       exit(1);
  54.    }
  55.  
  56.    numverts = 0;
  57.    while (!feof(f) && numverts<MAXVERTS) {
  58.       fscanf( f, "%f %f %f  %f %f %f",
  59.           &verts[numverts][0], &verts[numverts][1], &verts[numverts][2],
  60.           &norms[numverts][0], &norms[numverts][1], &norms[numverts][2] );
  61.       numverts++;
  62.    }
  63.    numverts--;
  64.  
  65.    printf("%d vertices, %d triangles\n", numverts, numverts-2);
  66.    fclose(f);
  67. }
  68.  
  69.  
  70.  
  71. static void draw_surface( void )
  72. {
  73.    GLuint i;
  74.  
  75. #ifdef GL_EXT_vertex_array
  76.    if (use_vertex_arrays) {
  77.       glDrawArraysEXT( GL_TRIANGLE_STRIP, 0, numverts );
  78.    }
  79.    else {
  80. #endif
  81.       glBegin( GL_TRIANGLE_STRIP );
  82.       for (i=0;i<numverts;i++) {
  83.      glNormal3fv( norms[i] );
  84.      glVertex3fv( verts[i] );
  85.       }
  86.       glEnd();
  87. #ifdef GL_EXT_vertex_array
  88.    }
  89. #endif
  90. }
  91.  
  92.  
  93.  
  94. static void draw1(void)
  95. {
  96.     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  97.     glPushMatrix();
  98.     glRotatef( yrot, 0.0, 1.0, 0.0 );
  99.     glRotatef( xrot, 1.0, 0.0, 0.0 );
  100.  
  101.     draw_surface();
  102.  
  103.     glPopMatrix();
  104.  
  105.     glFlush();
  106.     if (doubleBuffer) {
  107.     glutSwapBuffers();
  108.     }
  109. }
  110.  
  111.  
  112. static void Draw(void)
  113. {
  114.    if (speed_test) {
  115.       for (xrot=0.0;xrot<=360.0;xrot+=10.0) {
  116.      draw1();
  117.       }
  118.       exit(0);
  119.    }
  120.    else {
  121.       draw1();
  122.    }
  123. }
  124.  
  125.  
  126.  
  127. static void InitMaterials(void)
  128. {
  129.     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  130.     static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
  131.     static float position0[] = {0.0, 0.0, 20.0, 0.0};
  132.     static float position1[] = {0.0, 0.0, -20.0, 0.0};
  133.     static float front_mat_shininess[] = {60.0};
  134.     static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
  135.     static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
  136.     /*
  137.     static float back_mat_shininess[] = {60.0};
  138.     static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
  139.     static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
  140.     */
  141.     static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
  142.     static float lmodel_twoside[] = {(GLint)GL_FALSE};
  143.  
  144.     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  145.     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  146.     glLightfv(GL_LIGHT0, GL_POSITION, position0);
  147.     glEnable(GL_LIGHT0);
  148.     
  149.     glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
  150.     glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
  151.     glLightfv(GL_LIGHT1, GL_POSITION, position1);
  152.     glEnable(GL_LIGHT1);
  153.     
  154.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  155.     glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  156.     glEnable(GL_LIGHTING);
  157.  
  158.     glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_mat_shininess);
  159.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_mat_specular);
  160.     glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, front_mat_diffuse);
  161. }
  162.  
  163.  
  164. static void Init(void)
  165. {
  166.    glClearColor(0.0, 0.0, 0.0, 0.0);
  167.  
  168.    glShadeModel(GL_SMOOTH);
  169.    glEnable(GL_DEPTH_TEST);
  170.  
  171.    InitMaterials();
  172.  
  173.    glMatrixMode(GL_PROJECTION);
  174.    glLoadIdentity();
  175.    glFrustum( -1.0, 1.0, -1.0, 1.0, 5, 25 );
  176.  
  177.    glMatrixMode(GL_MODELVIEW);
  178.    glLoadIdentity();
  179.    glTranslatef( 0.0, 0.0, -6.0 );
  180.  
  181. #ifdef GL_EXT_vertex_array
  182.    if (use_vertex_arrays) {
  183.       glVertexPointerEXT( 3, GL_FLOAT, 0, numverts, verts );
  184.       glNormalPointerEXT( GL_FLOAT, 0, numverts, norms );
  185.       glEnable( GL_VERTEX_ARRAY_EXT );
  186.       glEnable( GL_NORMAL_ARRAY_EXT );
  187.    }
  188. #endif
  189. }
  190.  
  191.  
  192.  
  193. static void Reshape(int width, int height)
  194. {
  195.     glViewport(0, 0, (GLint)width, (GLint)height);
  196. }
  197.  
  198.  
  199.  
  200.  
  201. static void Key( unsigned char key, int x, int y )
  202. {
  203.    switch (key) {
  204.       case 27:
  205.      exit(0);
  206.       case 's':
  207.     smooth = !smooth;
  208.     if (smooth) {
  209.         glShadeModel(GL_SMOOTH);
  210.     } else {
  211.         glShadeModel(GL_FLAT);
  212.     }
  213.     break;
  214.       case 'l':
  215.     lighting = !lighting;
  216.     if (lighting) {
  217.         glEnable(GL_LIGHTING);
  218.     } else {
  219.         glDisable(GL_LIGHTING);
  220.     }
  221.     break;
  222.    }
  223.    glutPostRedisplay();
  224. }
  225.  
  226.  
  227. static void SpecialKey( int key, int x, int y )
  228. {
  229.    switch (key) {
  230.       case GLUT_KEY_LEFT:
  231.     yrot -= 15.0;
  232.     break;
  233.       case GLUT_KEY_RIGHT:
  234.     yrot += 15.0;
  235.     break;
  236.       case GLUT_KEY_UP:
  237.     xrot += 15.0;
  238.     break;
  239.       case GLUT_KEY_DOWN:
  240.     xrot -= 15.0;
  241.     break;
  242.     }
  243.     glutPostRedisplay();
  244. }
  245.  
  246.  
  247.  
  248. static GLenum Args(int argc, char **argv)
  249. {
  250.    GLint i;
  251.  
  252.    for (i = 1; i < argc; i++) {
  253.       if (strcmp(argv[i], "-sb") == 0) {
  254.      doubleBuffer = GL_FALSE;
  255.       }
  256.       else if (strcmp(argv[i], "-db") == 0) {
  257.      doubleBuffer = GL_TRUE;
  258.       }
  259.       else if (strcmp(argv[i], "-speed") == 0) {
  260.      speed_test = GL_TRUE;
  261.      doubleBuffer = GL_TRUE;
  262.       }
  263.       else if (strcmp(argv[i], "-va") == 0) {
  264.      use_vertex_arrays = GL_TRUE;
  265.       }
  266.       else {
  267.      printf("%s (Bad option).\n", argv[i]);
  268.      return GL_FALSE;
  269.       }
  270.    }
  271.  
  272.    return GL_TRUE;
  273. }
  274.  
  275.  
  276.  
  277. int main(int argc, char **argv)
  278. {
  279.    GLenum type;
  280.    char *extensions;
  281.  
  282.    read_surface( "isosurf.dat" );
  283.  
  284.    if (Args(argc, argv) == GL_FALSE) {
  285.       exit(0);
  286.    }
  287.  
  288.    glutInitWindowPosition(0, 0);
  289.    glutInitWindowSize(400, 400);
  290.    
  291.    type = GLUT_DEPTH;
  292.    type |= GLUT_RGB;
  293.    type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
  294.    glutInitDisplayMode(type);
  295.  
  296.    if (glutCreateWindow("Isosurface") <= 0) {
  297.       exit(0);
  298.    }
  299.  
  300.    /* Make sure server supports the vertex array extension */
  301.    extensions = (char *) glGetString( GL_EXTENSIONS );
  302.    if (!strstr( extensions, "GL_EXT_vertex_array" )) {
  303.       use_vertex_arrays = GL_FALSE;
  304.    }
  305.  
  306.    Init();
  307.  
  308.    glutReshapeFunc(Reshape);
  309.    glutKeyboardFunc(Key);
  310.    glutSpecialFunc(SpecialKey);
  311.    glutDisplayFunc(Draw);
  312.    glutMainLoop();
  313.    return 0;
  314. }
  315.